home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / Talking Telnet / source / config / LinkedList.c < prev    next >
Text File  |  1996-06-22  |  6KB  |  243 lines

  1. //LinkedList.c
  2.  
  3. #include "LinkedList.proto.h"
  4. short reSortElement(LinkedListNode **theHead, LinkedListNode *theChangedElement)
  5. {
  6.     LinkedListNode *leader, *copyOfNew;
  7.     short index = 1;
  8.     copyOfNew = (LinkedListNode *) myNewPtrCritical(sizeof(LinkedListNode));
  9.     copyOfNew->name = NewString(*theChangedElement->name);
  10.     copyOfNew->next = NULL;
  11.     deleteItem(theHead, *theChangedElement->name);
  12.     insertInSortedList(theHead, copyOfNew);
  13.     
  14.     //now its in there; return where it is
  15.     
  16.     leader = *theHead;
  17.     while ((leader->next != NULL)&&
  18.         (!(EqualString(*leader->name,*copyOfNew->name,TRUE,FALSE))))
  19.     {
  20.         leader = leader->next;
  21.         index++;
  22.     }
  23.     return index - 1;
  24. }
  25.  
  26. void deleteList(LinkedListNode **theHead)
  27. {
  28.     LinkedListNode *current,*nextNode;
  29.     current = *theHead;
  30.     if (current == NULL)
  31.         return;
  32.     nextNode = current->next;
  33.     while(current != NULL)
  34.     {
  35.         DisposeHandle((Handle)current->name);
  36.         DisposePtr((Ptr)current);
  37.         current = nextNode;
  38.         nextNode = nextNode->next;
  39.     }
  40.     *theHead = NULL;
  41. }
  42. void insertInSortedList(LinkedListNode **head, LinkedListNode *newItem)
  43. {
  44.     LinkedListNode  *leader, *trailer;
  45.     Boolean done = FALSE;
  46.     short newOneIsBigger;
  47.  
  48.     if (*head == NULL)//this is first element in list
  49.     {
  50.         *head = newItem;
  51.         return;
  52.     }
  53.     trailer = *head;
  54.     leader = (*head)->next;
  55.     if (leader == NULL)
  56.     {
  57.         (*head)->next = newItem;
  58.         newItem->next = NULL;
  59.         return;
  60.     }
  61.     
  62.     while (!done)
  63.     {
  64.         newOneIsBigger = RelString(*(newItem->name),*(leader->name),TRUE,FALSE);
  65.         if (newOneIsBigger == 1) 
  66.         {
  67.             if (leader->next == NULL)//end of list
  68.             {
  69.                 leader->next = newItem;
  70.                 newItem->next = NULL;
  71.                 done = TRUE;
  72.             }
  73.             else
  74.             {
  75.                 trailer = leader;
  76.                 leader = leader->next;
  77.             }
  78.         }
  79.         else
  80.         {
  81.             trailer->next = newItem;
  82.             newItem->next = leader;
  83.             done = TRUE;
  84.         }
  85.     }
  86. }    
  87. //returns position
  88. short createNodeAndSort(LinkedListNode **head, Str255 theName)
  89. {
  90.     short index=1;
  91.     LinkedListNode *leader = *head;
  92.     LinkedListNode *newNode = (LinkedListNode *)myNewPtrCritical(sizeof(LinkedListNode));
  93.     newNode->name = NewString(theName);
  94.     newNode->next = NULL;
  95.     if (*head == NULL)
  96.     {
  97.         *head = newNode;
  98.         return 1;
  99.     }
  100.     else
  101.     {
  102.         insertInSortedList(head, newNode);
  103.         
  104.         while ((leader->next != NULL)&&
  105.             (!(EqualString(*leader->name,theName,TRUE,FALSE))))
  106.         {
  107.             leader = leader->next;
  108.             index++;
  109.         }
  110.         return (index - 1);
  111.     }
  112. }
  113.     
  114. LinkedListNode *createSortedList(ResType ConfigResourceType,short numberofitems,Str255 placeThisFirst)
  115. {
  116.     short         index, resID;
  117.      Handle        ItemResource;
  118.     Str255        ItemName;
  119.     ResType        restype;
  120.     LinkedListNode *newNode, *theHead = NULL;
  121.     
  122.     if (placeThisFirst != NULL)
  123.     {
  124.         theHead =  (LinkedListNode *) myNewPtrCritical(sizeof(LinkedListNode));
  125.         ItemResource = Get1NamedResource(ConfigResourceType,placeThisFirst);
  126.         theHead->name = NewString(placeThisFirst); //set the head of our list
  127.         theHead->next = NULL;
  128.         if (ItemResource != NULL)
  129.             ReleaseResource(ItemResource);
  130.     }
  131.     for (index = 1; index <= numberofitems; index++)
  132.     {
  133.         ItemResource = Get1IndResource(ConfigResourceType, index);
  134.         GetResInfo(ItemResource, &resID, &restype, (StringPtr)&ItemName);
  135.         if (!(EqualString(placeThisFirst,ItemName,1,0)))
  136.         {
  137.             newNode = (LinkedListNode *) myNewPtrCritical(sizeof(LinkedListNode));
  138.             newNode->name = NewString(ItemName);
  139.             
  140.             insertInSortedList(&theHead, newNode);
  141.             ReleaseResource(ItemResource);
  142.         }
  143.     }
  144.     return (theHead);
  145. }
  146.  
  147. void deleteItem(LinkedListNode **theHead,Str255 ItemName)
  148. {
  149.     LinkedListNode *leader = *theHead, *trailer = *theHead;
  150.     while(!(EqualString(ItemName,*leader->name,TRUE,FALSE))&&(leader->next != NULL))
  151.     {
  152.         trailer = leader;
  153.         leader = leader->next;
  154.     }
  155.     if (leader == *theHead)
  156.     {
  157.         *theHead = (*theHead)->next;
  158.         DisposeHandle((Handle)leader->name);
  159.         DisposePtr((Ptr)leader);
  160.     }
  161.     else
  162.     {
  163.         trailer->next = leader->next;
  164.         DisposeHandle((Handle)leader->name);
  165.         DisposePtr((Ptr)leader);
  166.     }
  167. }
  168.  
  169. LinkedListNode *findNode(LinkedListNode *theHead,Str255 ItemName)
  170. {
  171.     LinkedListNode *leader = theHead;
  172.     while ((leader->next != NULL)&&(!(EqualString(ItemName,*leader->name,TRUE,FALSE))))
  173.         leader = leader->next;
  174.     
  175.     if (!(EqualString(ItemName,*leader->name,TRUE,FALSE)))
  176.         return NULL;
  177.     else
  178.         return(leader);
  179. }
  180.  
  181. short findClosestNodeIndex(LinkedListNode *theHead,Str255 ItemName)
  182. {
  183.     short index=1;
  184.     LinkedListNode *leader = theHead, *trailer = theHead;
  185.     while ((leader->next != NULL) &&
  186.     (RelString(*leader->name,ItemName,TRUE,FALSE) == -1))
  187.     {
  188.         trailer = leader;
  189.         leader = leader->next;
  190.         index++;
  191.     }
  192.     return index-1;
  193. }
  194.             
  195. short findNodeIndex(LinkedListNode *theHead,Str255 ItemName)
  196. {
  197.     short index = 1;
  198.     LinkedListNode *leader = theHead;
  199.     while ((leader->next != NULL)&&
  200.         (!(EqualString(*leader->name,ItemName,TRUE,FALSE))))
  201.     {
  202.         leader = leader->next;
  203.         index++;
  204.     }
  205.     
  206.     return (index - 1);
  207. }
  208.  
  209. void addListToMenu(MenuHandle theMenu, LinkedListNode *theHead)
  210. {
  211.     LinkedListNode *traverser = theHead;
  212.     short itemIndex = 1;
  213.     while(traverser != NULL)
  214.     {
  215.         HLock((Handle)traverser->name);
  216.         AppendMenu(theMenu,"\poops"); //these two avoid diacritcal interpertation of '<'
  217.         SetItem(theMenu,itemIndex,*traverser->name); 
  218.         HUnlock((Handle)traverser->name);
  219.  
  220.         traverser = traverser->next;
  221.         itemIndex++;
  222.     }
  223. }
  224.  
  225. void getAUniqueName(LinkedListNode *theHead, Str255 theName)
  226. {
  227.     while(findNode(theHead,theName))
  228.     {
  229.         if ((theName[theName[0]] > '9')||
  230.             (theName[theName[0]] < '0')) //add a number
  231.         {
  232.             theName[++theName[0]] = ' ';
  233.             theName[++theName[0]] = '1';
  234.         }
  235.         else if (theName[theName[0]] == '9') //add another digit
  236.         {
  237.             theName[theName[0]] = '-';
  238.             theName[++theName[0]] = '1';
  239.         }    
  240.         else
  241.             theName[theName[0]]++; //incremement the number        
  242.     }
  243. }